<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="K93Rq" id="K93Rq"><span data-lake-id="uc6d19c18" id="uc6d19c18">典型回答</span></h1>
  <p data-lake-id="u74905f2e" id="u74905f2e"><span data-lake-id="ud8509bfc" id="ud8509bfc">​</span><br></p>
  <p data-lake-id="u229a2148" id="u229a2148"><span data-lake-id="ua9cc8986" id="ua9cc8986">客户端与配置中心的数据交互方式其实无非就两种，要么推 ，要么就是拉 。</span></p>
  <p data-lake-id="u9be3a0ad" id="u9be3a0ad"><span data-lake-id="u2822d71a" id="u2822d71a">​</span><br></p>
  <p data-lake-id="u937a3696" id="u937a3696"><strong><span data-lake-id="u944836f0" id="u944836f0">推的模式</span></strong><span data-lake-id="ue32c1d50" id="ue32c1d50">就客户端和服务端建立TCP长链接，当服务端数据发生变化，立即通过这个已经建立好的长连接将数据推送到客户端。</span></p>
  <p data-lake-id="u6824b6d0" id="u6824b6d0"><span data-lake-id="u03f82f20" id="u03f82f20">​</span><br></p>
  <p data-lake-id="u536bdd46" id="u536bdd46"><span data-lake-id="uc9f8140f" id="uc9f8140f">长链接的优点是实时性，一旦数据变动，客户端立即就能感知到。但是缺点就是服务端需要维护大量的TCP连接，这会占用大量的内存和CPU资源，同时也容易受到网络抖动等因素的影响。</span></p>
  <p data-lake-id="u603e58f6" id="u603e58f6"><span data-lake-id="u76496d23" id="u76496d23">​</span><br></p>
  <p data-lake-id="uc8e141af" id="uc8e141af"><strong><span data-lake-id="ud425591a" id="ud425591a">拉的模式</span></strong><span data-lake-id="u37aa86f0" id="u37aa86f0">就是客户端轮询，通过不断轮询的方式检查数据是否发生变化，变化的话就把数据拉回来。</span></p>
  <p data-lake-id="u54bfd8f3" id="u54bfd8f3"><span data-lake-id="u39c2186f" id="u39c2186f">​</span><br></p>
  <p data-lake-id="ua1e3ac7d" id="ua1e3ac7d"><span data-lake-id="u52b99380" id="u52b99380">轮询的优点是实现比较简单，但弊端也显而易见，轮询无法保证数据的实时性，并且轮询方式对服务端还会产生压力。</span></p>
  <p data-lake-id="u62509f46" id="u62509f46"><strong><span data-lake-id="uc69ce262" id="uc69ce262">​</span></strong><br></p>
  <p data-lake-id="u69a29575" id="u69a29575"><strong><span data-lake-id="u2060c80c" id="u2060c80c">那Nacos使用的是哪种模式呢？</span></strong></p>
  <p data-lake-id="ud4d418b4" id="ud4d418b4"><strong><span data-lake-id="ucf1cd60b" id="ucf1cd60b">​</span></strong><br></p>
  <p data-lake-id="u3d1caab4" id="u3d1caab4"><strong><span data-lake-id="u9144e91d" id="u9144e91d">在Nacos1.x版本中采用的是长轮询，看好哦，不是长连接，也不是轮询，是</span></strong><span data-lake-id="u680b3b56" id="u680b3b56">长轮询（Long Polling）。</span></p>
  <p data-lake-id="uc9f925a2" id="uc9f925a2"><span data-lake-id="u8147ce32" id="u8147ce32">在Nacos2.0中，采用gRPC长连接。</span></p>
  <p data-lake-id="uec8e906f" id="uec8e906f"><span data-lake-id="uee49835d" id="uee49835d">​</span><br></p>
  <p data-lake-id="ud043348f" id="ud043348f"><span data-lake-id="ued337446" id="ued337446">其实就是把长连接和轮询综合了一下，就是说客户端发起轮询，但是不立即返回，而是hold一段时间，这段时间保持着一个有效连接，超时或者变化再返回，然后再发起一次轮询。</span></p>
  <p data-lake-id="ub62579e3" id="ub62579e3"><span data-lake-id="u558e637c" id="u558e637c">​</span><br></p>
  <h1 data-lake-id="yCmgg" id="yCmgg"><span data-lake-id="u02a9d753" id="u02a9d753">扩展知识</span></h1>
  <p data-lake-id="udb463200" id="udb463200"><br></p>
  <h2 data-lake-id="Gy8Kr" id="Gy8Kr"><span data-lake-id="uf39a5d0f" id="uf39a5d0f">长轮询</span></h2>
  <p data-lake-id="ufab1b5a4" id="ufab1b5a4"><strong><span data-lake-id="u4eb04875" id="u4eb04875">​</span></strong><br></p>
  <p data-lake-id="u2a408846" id="u2a408846"><span data-lake-id="ue1457787" id="ue1457787">大概过程就是客户端向Nacos服务器发起一个长轮询请求，Nacos不会立即返回结果，而是会将请求挂起，直到有配置变化或者超时才会响应。当配置发生变化时，Nacos服务器会把变化后的配置信息响应客户端，并且客户端会再次发起一个新的长轮询请求。这样，客户端就能够实时感知到配置的变化。</span></p>
  <p data-lake-id="uaecbe856" id="uaecbe856"><span data-lake-id="u712e4876" id="u712e4876">​</span><br></p>
  <p data-lake-id="u6ec98c6c" id="u6ec98c6c"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1677917788586-beb9bfc7-35b1-4960-be3b-5e8589a8f013.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_42%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="ufa370c66" id="ufa370c66"><br></p>
  <p data-lake-id="u271d6fcb" id="u271d6fcb"><span data-lake-id="uc002f345" id="uc002f345">这种方式避免客户端对服务端的不断轮询造成压力，也避免了长时间保持连接所带来的负担，同时也可以保证配置的实时性。但是，长轮询的缺点是需要频繁地发起HTTP请求，这会增加网络开销，同时也可能会受到网络延迟等因素的影响，导致配置的实时性不如长连接。</span></p>
  <p data-lake-id="u2edcd886" id="u2edcd886"><span data-lake-id="u7842c963" id="u7842c963">​</span><br></p>
  <h2 data-lake-id="MRoIK" id="MRoIK"><span data-lake-id="u91e887d5" id="u91e887d5">长轮询和长连接</span></h2>
  <p data-lake-id="ud2bc76ae" id="ud2bc76ae"><span data-lake-id="u9c330fe3" id="u9c330fe3">​</span><br></p>
  <p data-lake-id="ud80322b0" id="ud80322b0"><strong><span data-lake-id="u258fd6b0" id="u258fd6b0">长轮询是一种实现异步消息通信的机制</span></strong><span data-lake-id="u9fe614dd" id="u9fe614dd">，它通常用于客户端向服务器端请求某个资源时，如果服务器端没有即时可用的响应数据，就会将客户端的请求挂起，直到服务器端有了可用的响应数据，再将数据返回给客户端。因此，</span><strong><span data-lake-id="u4e35368a" id="u4e35368a">长轮询的过程是客户端主动发起请求，服务器端被动响应请求。</span></strong></p>
  <p data-lake-id="ue1304941" id="ue1304941"><span data-lake-id="u68e251da" id="u68e251da">​</span><br></p>
  <p data-lake-id="u4e1330d2" id="u4e1330d2"><strong><span data-lake-id="u1c1bbf90" id="u1c1bbf90">长连接是指在客户端和服务器端之间建立一条持久连接</span></strong><span data-lake-id="ubc82d3ff" id="ubc82d3ff">，通过该连接可以在一定时间内保持通信状态，避免了客户端频繁地建立和关闭连接所带来的额外开销。在长连接中，客户端和服务器端之间会保持一定的心跳机制，以确保连接的有效性。因此，</span><strong><span data-lake-id="uad248739" id="uad248739">长连接的过程是由服务器端主动维护连接，客户端被动地接受服务器端的消息。</span></strong></p>
  <p data-lake-id="ud1e6735a" id="ud1e6735a"><br></p>
  <p data-lake-id="uf033919b" id="uf033919b"><span data-lake-id="ufd26b8bb" id="ufd26b8bb">在数据变化感知的实时性上面，长连接比长轮询要更加精准，感知的更快，长轮询也是有可能发生延迟的。</span></p>
  <p data-lake-id="u798314a6" id="u798314a6"><span data-lake-id="uf8d8471d" id="uf8d8471d">​</span><br></p>
  <p data-lake-id="u0b1dfecc" id="u0b1dfecc"><span data-lake-id="u1643af4a" id="u1643af4a">在协议层面上，长连接是基于TCP实现的，长轮询是基于HTTP实现的。</span></p>
 </body>
</html>